{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Simplex example\n", "\n", "## Try me\n", " [![Open In Colab](../../_static/colabs_badge.png)](https://colab.research.google.com/github/ffraile/operations-research-notebooks/blob/main/docs/source/CLP/tutorials/Simplex%20Graphic%20explanation.ipynb)[![Binder](../../_static/binder_badge.png)](https://mybinder.org/v2/gh/ffraile/operations-research-notebooks/main?labpath=docs%2Fsource%2FCLP%2Ftutorials%2FSimplex%20Graphic%20explanation.ipynb)\n", "\n", "## Graphic and algebraic correspondences\n", "In this notebook we will analyse the Simplex algorithm alternating between the graphical and the algebraic representation and using a problem as an example:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Problem Definition\n", "Production Mix\n", "A company produces two kinds of products, P1 and P2.\n", "\n", "The selling price of P1 is 300€\n", "The selling price of P2 is 250€\n", "\n", "- P1 requires 2 operator man hours and 1 hour of machine operating time\n", "- P2 requires 1 operator man hours and 3 hours of machine time\n", "- Operator man hours cannot be higher than 40 hours per day\n", "- Machine operating time cannot be higher than 45 hours per day\n", "- Marketing states that P1 units per day cannot be higher than 12\n", "\n", "\n", "***How many units of P1 and P2 should the company produce every day to maximise income?*** " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model\n", "We want to find the maximum solution to:\n", "\n", "$max Z = 300x_{1} + 250x_{2}$\n", "\n", "This is our objective function. The decision variables are:\n", "\n", "$x_{1}:$ units of Product 1\n", "\n", "$x_{2}:$ units of Product 2\n", "\n", "The objective function is subject to the following constraints:\n", "\n", "$2x_{1} + x_{2} \\leq 40$ \n", "$x_{1} + 3x_{2} \\leq 45$ \n", "$x_{1} \\leq 12$ \n", "\n", "We define the problem in its standard form as:\n", "\n", "$max Z = 300x_{1} + 250x_{2} + 0s_{1} + 0s_{2} + 0s_{3}$\n", "\n", "Where: \n", "\n", "$s_{1}:$ Slack variable of the operator man hour constraint ($s_1 \\geq 0$)\n", "\n", "$s_{2}:$ Slack variable of the machining time constraint ($s_2 \\geq 0$)\n", "\n", "$s_{3}:$ Slack variable of the operator man hour constraint ($s_3 \\geq 0$)\n", "\n", "And thus, by entering the slack variables, we can now express the constraints as:\n", "\n", "$2x_{1} + x_{2} + s_{1} = 40$ \n", "$x_{1} + 3x_{2} + s_{2} = 45$ \n", "$x_{1} + s_{3} = 12$ " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution \n", "We will use the Simplex Method and iterate between the graphical and the algebraic form of the problem to describe the results.\n", "First let us represent the problem:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [ { "data": { "text/plain": [ "Text(12, 11, 'E')" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAEWCAYAAAC63OldAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Z1A+gAAAACXBIWXMAAAsTAAALEwEAmpwYAABQd0lEQVR4nO3deVxUZfs/8M89w74jO8iiguCKa+6aS7iX+bg/+uSWfn+55FKGjz5alFmWUlZmZpZWllZqaa6lllsqKoIbuGuKICqbIOv9++MMgTgIwsBh4PN+vc5rnPvcM3PNCeXqnPtcl5BSgoiIiIgMR6N2AERERETVDRMsIiIiIgNjgkVERERkYEywiIiIiAyMCRYRERGRgZmoHUBlcnZ2ln5+fmqHYZRi7sQAAAKdAlWOhIgq27FjxxKllC7lfA8/rVY7QaPR9JZSOhoqNqLKJoS4l5eXty03N3dFy5YtrxQ7ryaVaWjVqpWMiIhQOwyj9PRXTwMA9o7eq2ocRFT5hBDHpJStyvr6Y8eO+Zmamm5wc3NzcHBwSDUzM8sWQhgyRKJKIaVEVlaWaVJSkm18fHxSdnb2wOKSLF4iJCKiCqXVaie4ubk5uLm53TU3N2dyRUZLCAFzc/NsNze3u25ubg5arXZCcXOZYBERUYXSaDS9HRwcUtWOg8iQHBwcUjUaTe/i9jPBIiKiCiWldDQzM8tWOw4iQzIzM8t+3HpCJlhERFTheFmQqpuSfqaZYBEREREZGBMsIiIiIgNjgkVERERkYEywiIiIiAyMCRYREZEBRUVFmU+bNs0zODg4yNHRMdja2rp5UFBQw9dee809JSWFv3crQWpqqqZ27dpNhBAt//Of//jom5Obm4s33njDtU6dOo3Mzc1buLu7N33xxRdrG+q/UY1qlUNERFTRli9f7rx69WrX7t27Jw0ZMuSuqamp/OOPP2wXLVrktWnTplrHjh07a2NjU3PaqKhg5syZnvfu3XtsjjN+/Hjvr776yvWZZ55Jmjx5cvzZs2ctvvzyS9fo6GirAwcOxGq12nLFwEyaiIjIgIYNG3bv2rVrUb/88svlOXPmJMyaNev2r7/+emnKlClxsbGxlkuXLnVWK7YtW7bYCiFabtmyxVatGMoiNTVV891339knJiaWmPXs37/fatWqVW6vvvrqzeLmREREWKxevdo1JCQkaefOnRdnzpyZuHLlyr/feOONvw8fPmz7+eef1ypvzEywiIiIDKhz587pTk5OuUXHR44ceQ8ATp06ZZk/lpaWJtzc3Jp6eHg0ycjIeKiw0tChQ321Wm3LFStWqNocW60Yo6KizMPCwlw7duwY4Ozs3GzEiBH+t27deuxZqZycHEycONG3U6dOycOHD79X3Lw1a9bUklJi+vTp8YXHp0+fftvCwiLvu+++Y4JFRERkDK5cuWIKAG5ubjn5YzY2NjI0NPTmrVu3zBYtWuSSPz5p0iSv9evXOy9YsODahAkTik0UKkNlxZiWlibWrVtn/8ILL3h7e3s3Dg4Objx//nzv+Ph4szFjxiRs3rw5NigoKPNx7xEWFuZ26dIli+XLl1973Lzjx49bazQadOnS5X7hcSsrK9mgQYOMqKgo6/J+H67BIiIi1bz640nv2FupVmrHUVh9d9v09wYFXzfke+bk5GDhwoWeWq1Wjh49+k7hfVOmTElctmyZ24cffugxbdq0xA8//NB52bJl7jNnzrwZGhp625BxlFVFxZieni7Cw8NdduzYYX/kyBHbzMxMYWlpmde2bdvUKVOmxA8cODDJ39+/VG2Wzp07Z/bee+95zpgxIy4wMDArJibGrLi5CQkJpg4ODjmWlpaPrIVzd3fPOnHihPWDBw+EhYVFmdfKMcEiIiKqYOPGjfOOjIy0Dg0NvREcHPzQWRgTExOEhYX9PWLECP9evXr5Hz582PaFF15IeP/99+PK85m5ublISEh46Pd8UlKSNv8xLi7uoX2urq45xS3srqgYr1+/bjp37lxvADA1NZUTJkyIX7hw4c1atWrlPel7jR8/3tfb2ztz3rx58SXNzcjI0JiZmen9DHNz8zwASEtL01hYWDxyqbe0mGAREZFqDH2mqCp6+eWXPdesWeM6fPjwxIULF97SN2f48OHJb775Zvpff/1l269fv7urVq165LisXLnS8dNPP3U9e/aslaOjY86NGzeiH/e5Fy5cMAsKCmqib9+oUaPqFR07d+5cdGBgYFZx71dSjBkZGWLMmDE++/fvt7t3756Ji4tL9osvvpgwZ86chOLe09vbO/vNN9+8vmPHDvujR4/arlixwm3NmjUu7dq1Sw0JCUkeMGBAclBQULEx5Vu2bFmtgwcP2m3bti3G3Ny8xLNOlpaWeXfu3DHVty8zM1MDADY2Nk+c5BXGBIuIiKiCzJgxw3Pp0qUegwYNuvPNN99cLW7e559/7hgTE2MFKL/YNZpHl0g7OTnlTpw4MSE+Pt50+fLlbiV9tre3d/bGjRtjC4+dOHHCKiwsrPa8efP+bt68eXrR+Y97v5JizM7OFm5ubtnbt2+PbdCgQebhw4ct+/fvX9/NzS17/PjxetdoWVlZyblz5ybMnTs3IS0tTWzZssVu69at9nv27LHbs2eP/ezZs+Hn5/egW7duKX379k3u379/iqnpw3lRRkaGmDt3rneXLl2Svby8sk+dOmUOAFevXjUFgJSUFO2pU6fM3d3dc5ydnXMBwNXVNfvixYuWGRkZouhlwlu3bpk5ODjklOfyIAAIKatOKQ4hhBWAUwDqAPhESjm5yP5AAO8C6ALADMBxAPOllLtL8/6tWrWSERERhg26hnj6q6cBAHtH71U1DiKqfEKIY1LKVmV9/cmTJ68EBwcnGjImYzBjxgzP8PBwj4EDB95Zv379leIuv23YsMFu2LBh/t26dUsyNTWV27Ztq3XkyJHTLVq0eKBv/tdff+0QGhrqXdIZLH22bNli279///qbN2+O7devX2ppX/ekMeYbNmyYr4WFRd5XX331xGcqT548ab5p0yb7nTt32kdERNhmZWWJ6OjoU40bN37oEmtiYqLWxcWlWUnv97///e/vsLCweACYOnWq50cffeSxbdu2mF69eqXlz0lPTxdOTk7NWrdunfbnn3+eL0WMzsHBwX769lW1M1hhAFz07RBC1ANwEEAOgEUAkgG8CGCHEKK3lPK3SouSiIjoMV555RWP8PBwjwEDBjw2udq9e7f1yJEj67Vo0SJt48aNly9dumS2fft2x1mzZnn99ttvFys5bL3KGmNmZqY4fPiwzZQpU0pcE6VPcHBwZnBwcML8+fMTUlJSNFu2bLF1d3fPKTrP1tY2b9WqVZeKjickJJiEhob6dOrUKWXMmDGJLVu2/OeM3ciRI+99/PHHHuHh4W6FE6zw8HCXBw8eaIYNG3an6Ps9qSqTYAkhWgCYBmAWgMV6piwE4ACgpZQyUveaNQBOA/hECBEkq9LpOCIiqpEWLlzosnjxYk8PD4+s7t27p3722WcP1VTy8PDIef7551OOHTtmMXDgwAA/P78HW7duvWBpaSkbNWqUOWTIkMS1a9e67Ny50zokJOR+cZ9TGcoT45gxY3ysra3zXnrppWKTlcTERO3bb79d4uXOfN27d08rOmZubi7HjBnzyCXImJgYs9DQUPj5+WUW3f/UU09ljBo1KmHNmjWuISEh9Xr16pWcX8m9devWaRMnTrxb2piKUyUSLCGEFsDnALYD2IAiCZYQwhrAswD25idXACClTBNCrIRy5qs1gCOVFTMREZE+ERER1gAQFxdnNmXKFL+i+1u3bp3WuHHjB3379q1vZ2eXs2PHjvOF75pbsGBB3IYNG5xCQ0O9Q0JCzlVi6A85f/68WVljHD9+fO2IiAjrP/74I/Zxa5nu3LmjDQ8P9yhtTGPHjr3j5uZW5jv7Cvviiy+u+/n5Za1evdpl79699g4ODjmjR49OWLx48c3ytskBqkiCBWA6gCAA/ypmf1MA5gAO6dn3l+6xxAQrM7tcNwQQERGV6KeffroC4EpJ827duhWlb9zPzy87IyPjhIHDAgD069cvVUp5rDRzAwICssoS49ixY733799vu3fv3lgPD49HLukVFhgYmFXaeJ5USe9tYmKCN954I/6NN94o0yXMkqheyV0IUQfAGwDCpJRXipnmqXu8oWdf/phXSZ917W46HmQbJPElIiKqVDk5OUhPTxfZ2dlCSon09HRRtHWN2kaPHu29b98+u71798Z6eno+Nrmq7lRPsAAsB3AJwJLHzMmv8quvRP6DInMeIoSYIISIEEJEPMjJxZJdsfqmERERVWnLli1zsra2bjFu3Li6cXFxZtbW1i38/f0bqx1XvtjYWLPVq1e7Xrt2zdzf37+JlZVVcysrq+adO3cOUDs2Nah6iVAIMRLAMwA6SykfV38jf+W/uZ59FkXmPERKuQLACgDw8G8kP993Cd2CXNG2rlMZoyYiIqp8U6dOvTN16tRy391WUerXr19hl/uMkWpnsIQQ5lDOWm0FcEsI4S+E8Afgq5tirxtzAHBTN6bvMmD+mL7Lhw/xsLeATy0rzFx/EqkPStXaiIiIiOiJqXmJ0BJKzau+AM4X2vbq9o/UPR8PIBrK5cF2et6nre6xxAqiGiGwZEgzxCVn4I3NZ8oVPBEREVFx1LxEeB/AYD3jLgCWQSnZ8AWAKF05hs0ABgohgqWUJwFACGEDJQE7j1KWaGjp64iXnvbHx3suoEcDN/Rq7G6I70JERET0D9USLN2aqx+Ljgsh/HR/vCilLLx/NoDuAHYKIcIBpECp5O4FoO+TFBmd2j0Ae2IS8N+N0Wjh6wBXW4uSX0RERERUSlXhLsJSkVJeANABSt2rUADvQzkL1ktKueNJ3svMRIMPhjZDWmYOZv8UDRaAJyIiIkOqcgmWlPKKlFIUbfSs23dWSvmclNJBSmklpexY1h6EAW62eK1XEH4/l4B1R5+4ByURERFRsapcglWZxrT3Q/t6TgjbcgZX76ja7omIiIiqkRqdYGk0Au8NDoZWIzBz/Unk5vFSIREREZVfjU6wAMDLwRJhzzVCxNV7+OzPi2qHQ0RERNVAjU+wAGBAMy/0beKB8F2xOH0zWe1wiIiIyMgxwQIghMBbAxrD0coM09dFsiE0ERERlQsTLB1HazO8O6gpYuPT8P6OGLXDISIiIiPGBKuQroGuGNnWB18cuIxDF6tsP00iIqJyOXnypPmzzz5bp27duo1sbW2bWVpaNq9Tp06j8ePH17569aqp2vEZQmpqqqZ27dpNhBAt//Of//gU3S+EaKlvs7Kyam6Iz1ezVU6V9N8+DXDgwh288sNJbJvWCXYW1eLnjIiI6B9XrlwxS0hIMO3Tp09S7dq1s0xMTGR0dLTl2rVrXX755ZdaJ06cOOPl5ZWjdpzlMXPmTM979+49Ns9p2bJl2tixY28XHjM1NTVISQEmWEVYmZlgyZBgDFp+CK//chpLhjRTOyQiIqJibdmyxbZ///71N2/eHNuvX7/U0rzmueeeS33uuecemdulS5e0cePG1f3000+d3nrrrXjDR1s2qampmi1bttg+88wzac7OziUulN6/f7/VqlWr3ObOnfv3G2+8Ubu4eb6+vpkvvfTSXcNGq+AlQj2a+zhi0tP1sOH4DWyLjlM7HCIiMiJpaWnCzc2tqYeHR5OMjAxReN/QoUN9tVptyxUrVjiqFd/j1KlTJxMAip75UeM7RUVFmYeFhbl27NgxwNnZudmIESP8b926VeKJoZycHEycONG3U6dOycOHD79X0vwHDx6I5ORkg+dDTLCKMaV7AJp42eO/G6ORkPJA7XCIiMhI2NjYyNDQ0Ju3bt0yW7RokUv++KRJk7zWr1/vvGDBgmsTJkwo8Rd/ZUhPTxdxcXEmFy9eNN2wYYPdSy+95AcA/fv3f6hmUWV8p7S0NLFu3Tr7F154wdvb27txcHBw4/nz53vHx8ebjRkzJmHz5s2xQUFBmSW9T1hYmNulS5csli9ffq2kudu2bXO0sbFp4eDg0LxWrVrBL7zwgvedO3e05fke+XiJsBimWg3Chwaj79L9eO2nKKwa3RpCiJJfSEREpbdpkjcSzlipHcZDXBumY8An5WpSO2XKlMRly5a5ffjhhx7Tpk1L/PDDD52XLVvmPnPmzJuhoaG3S36HyvHBBx84z5kz558F4J6enlnLli273KtXr7SicyviO6Wnp4vw8HCXHTt22B85csQ2MzNTWFpa5rVt2zZ1ypQp8QMHDkzy9/fPLu37nTt3zuy9997znDFjRlxgYGBWTEyMWXFzmzRpcn/AgAH3AgICMpOTk7Xbt2+3X7NmjeuhQ4dsjx49es7e3j6vLN8pHxOsx/B3tUVo7yC8sfkMvjtyHSPaPHITAhER0SNMTEwQFhb294gRI/x79erlf/jwYdsXXngh4f333y/XupPc3FwkJCQ89Ls7KSlJm/8YFxf30D5XV9ccrbb4EzJDhw5Natiw4YPU1FTt8ePHrbZv3+6QmJioNzeoiO90/fp107lz53oDyuLyCRMmxC9cuPBmrVq1ypTcjB8/3tfb2ztz3rx5Ja4fi4qKOlf4+eTJk++Ehoa6v/vuu15vv/2267vvvnurLDHkE1LWnP57rVq1khEREU/0mrw8iVGrDuP41SRse7kT/JytKyi6qu3pr54GAOwdvVfVOIio8gkhjkkpW5X19SdPnrwSHBycaMiYjEXDhg0bnD171qpfv353f/7558sazcMrc1auXOn46aefup49e9bK0dEx58aNG9GPe7+YmBizoKCgJqX9/HPnzkUHBgZmlXb+4cOHLTt16tRg5syZNxcuXKg3wSjuO2VkZIgxY8b47N+/3+7evXsmLi4u2S+++GLCnDlzEor7vPT0dLFkyRKXHTt22B89etQ2MzNTWFhY5LVr1y41JCQkecCAAclBQUGlin/ZsmW1Jk+eXGfbtm0xPXv2TAMKjteoUaNur1mzpsRLhpmZmcLW1rZ5o0aN0k+cOHGupPknT550Dg4O9tO3j2ewSqDRCLw/OBg9w//EjPWRWD+xHUy0XLpGRESP9/nnnzvGxMRYAYCNjU1e0eQKAJycnHInTpyYEB8fb7p8+XK3kt7T29s7e+PGjbGFx06cOGEVFhZWe968eX83b948vej8J4m5TZs2GQ0aNEj/8ssvXfUlWI/7TtnZ2cLNzS17+/btsQ0aNMg8fPiwZf/+/eu7ublljx8/Xu/6LCsrKzl37tyEuXPnJqSlpYktW7bYbd261X7Pnj12e/bssZ89ezb8/PwedOvWLaVv377J/fv3TzE1fbR8UkZGhpg7d653ly5dkr28vLJPnTplDgD5Nb1SUlK0p06dMnd3d8953F2I5ubm0sXFJbuk8g6lwTNYpfRz5A28/H0kXu0ZiEld/Q0cWdXHM1hENRfPYD25DRs22A0bNsy/W7duSaampnLbtm21jhw5crpFixZ675r6+uuvHUJDQ71LOoOlT1nKNDxOYGBgw2vXrplnZGScKDz+pN8JAIYNG+ZrYWGR99VXXz3xmraTJ0+ab9q0yX7nzp32ERERtllZWSI6OvpU48aNH1nonpiYqHVxcWlW0nv+73//+zssLKzYy4fp6enCzs6ueXBw8P1jx46V2NaFZ7AM4NlgT+w6E4/wXbHoUt8Fjb3s1Q6JiIiqoN27d1uPHDmyXosWLdI2btx4+dKlS2bbt293nDVrltdvv/12Ue34AODatWsmPj4+jxQS3bx5s+2FCxcsn3rqqYcStbJ8p8zMTHH48GGbKVOmlKmeVnBwcGZwcHDC/PnzE1JSUjRbtmyxdXd311v81NbWNm/VqlWXio4nJCSYhIaG+nTq1CllzJgxiS1btkwHgFu3bmnd3d0fOZM1ffp0r9zcXNG7d++kssRcGBOsUspvCH30yl1MXxeJzVM6wsLUIHdyEhFRNXHs2DGLgQMHBvj5+T3YunXrBUtLS9moUaPMIUOGJK5du9Zl586d1iEhIffVjnPcuHG+CQkJpp06dUr19fXNfPDggeb48eNWW7ZsqWVlZZW7ePHif844lfU7jRkzxsfa2jrvpZdeKrb3XGJiovbtt98u8dJovu7duz9ydyOgXNobM2bMI5chY2JizEJDQ+Hn55dZeP+cOXM8jx07Zt2xY8dUHx+frLS0NM3OnTvtDx8+bNu0adP7oaGhxa4bKy0mWE/AwcoMiwYF44VVR7Boewzm9W+odkhERFRFnD9/3qxv37717ezscnbs2HG+8J1wCxYsiNuwYYNTaGiod0hISImLpyva0KFD73777bdOP/74o9O9e/dMhBDw8PDIHDFixO25c+fGBwQEZAFl/07jx4+vHRERYf3HH3/EWlhYFLsW6c6dO9rw8HCP0sY9duzYO25ubiVWci9J165dU2NiYizWr1/vlJycbKLRaKSvr2/ma6+9dmPevHnxVlZW5V4/xTVYZTDv51NYc+gq1o5vg/b+zgaIrOrjGiyimotrsCpeedZgVTVjx4713r9/v+3evXtjPT09jbqfYUketwaLt8OVwezeDVDX2Rqv/HASyRlPdIMGERHRP3JycpCeni6ys7OFlBLp6emiaCsaYzJ69Gjvffv22dWE5KokTLDKwNJMiyVDmyE+NROv/3Ja7XCIiMhILVu2zMna2rrFuHHj6sbFxZlZW1u38Pf3b6x2XGURGxtrtnr1atdr166Z+/v7N7GysmpuZWXVvHPnzgFqx6YGrsEqo2beDpjc1R8f/n4ezzR0Q58mpb6ETEREBACYOnXqnalTpxa7CNyY1K9fP0tKeUztOKoKnsEqh8nd/NG0NhtCExER0cOYYJWD0hC6GR5k52LWT1GoSTcMEBERUfGYYJVTPRcbzO7dAHtjbuPbwyW2OSIiIqIagAmWAYxq64tOAc5Y8OtZXE5UvX4cERERqYwJlgFoNALvDQqGmYkG09dFIic3r+QXERERUbXFBMtA3O0t8OaAxoi8noRP91aJVlNERESkEiZYBvRssCeeDfbEh7+fR/TfyWqHQ0RERCphgmVgbz7XGM425pi27gQeZJe7XRIREREZISZYBmZvZYr3BjfFxdv38e521ft5EhERkQqYYFWATgEuGN3eD18euIL959nflIiIqKZhglVBXusVhLou1nj1x5NITmdDaCIiopqECVYFsTTTInxIMySkZmLeL6fUDoeIiIgqkaoJlhAiUAjxrRDirBAiWQiRLoQ4J4RYIoR4pHuybv4mIcQ9IcR9IcQ+IUQ3NWIvjWBvB0ztFoCfI29iS9RNtcMhIiL6x+zZs9179+5dt3bt2k2EEC29vLyaFDc3KirKfNq0aZ7BwcFBjo6OwdbW1s2DgoIavvbaa+4pKSk8WaOHicqfXxuAB4CNAP4GkAOgCYAJAIYJIZpJKRMAQAhRD8BB3ZxFAJIBvAhghxCit5TyNxXiL9GkrvWwOyYBczaeQivfWnC3t1A7JCIiIrzzzjte9vb2uQ0bNryfmpqqfdzc5cuXO69evdq1e/fuSUOGDLlramoq//jjD9tFixZ5bdq0qdaxY8fO2tjYsCFvIapmnVLK36WU3aSU/5VSLpNSrpBSTgEwBkriNbrQ9IUAHAD0lFIulFIuA9AJwE0AnwghRCWHXyomWg3ChwQjM4cNoYmIqHKkpqZqvvvuO/vExMRiE6fTp09HJyUlRR48ePC8q6vrYxcLDxs27N61a9eifvnll8tz5sxJmDVr1u1ff/310pQpU+JiY2Mtly5d6mz4b2Hcquppvau6R0cAEEJYA3gWwF4pZWT+JCllGoCVAOoDaF3JMZZaXRcbzOnTAH/G3sY3f10t+QVERGS00tLShJubW1MPD48mGRkZD/3P/9ChQ321Wm3LFStWOBr6c6OioszDwsJcO3bsGODs7NxsxIgR/rdu3Sr2SlXDhg2zSvvenTt3TndycnqkuOPIkSPvAcCpU6csyxZ19VUlEiwhhIUQwlkIUVsIEQLgM92urbrHpgDMARzS8/K/dI9VNsECgJFtfdG5vgsWbD2LS7fT1A6HiIgqiI2NjQwNDb1569Yts0WLFrnkj0+aNMlr/fr1zgsWLLg2YcKEe+X9nLS0NLFu3Tr7F154wdvb27txcHBw4/nz53vHx8ebjRkzJmHz5s2xQUFBmeX9nMe5cuWKKQC4ubnlVOTnGCO112DlGw/go0LPrwAYKaXcp3vuqXu8oee1+WNe+t5YCDEBypou+Pj4lDvQshJC4L1BTRES/iemrz+Jn/6vHUy0VSK/JSJSzdifx3qfSjhlpXYchTV2bZy+6rlV18vzHlOmTElctmyZ24cffugxbdq0xA8//NB52bJl7jNnzrwZGhp6u6zvm56eLsLDw1127Nhhf+TIEdvMzExhaWmZ17Zt29QpU6bEDxw4MMnf379SagPl5ORg4cKFnlqtVo4ePfpOZXymMakqCdYmAOcA2ABoDuVyYOHrufl/+fRl4g+KzHmIlHIFgBUA0KpVK1UXQLnZWWDB840xee0JfLLnIl7uEaBmOEREVEFMTEwQFhb294gRI/x79erlf/jwYdsXXngh4f33348rz/tev37ddO7cud4AYGpqKidMmBC/cOHCm7Vq1cozTOSlN27cOO/IyEjr0NDQG8HBwRV6pswYVYkES0r5N5S7CAFgkxDiJwBHhRBWUsqFANJ1+8z1vDz/trx0PfuqnH5NPbHrTDyW7j6PpwNdEOztoHZIRESqKe+Zoqps+PDhyW+++Wb6X3/9ZduvX7+7q1Y9+l1Xrlzp+Omnn7qePXvWytHRMefGjRvRj3tPb2/v7DfffPP6jh077I8ePWq7YsUKtzVr1ri0a9cuNSQkJHnAgAHJQUFBpV5bVVYvv/yy55o1a1yHDx+euHDhwlsV/XnGqEpeo5JSRgE4AeAl3VB+ESl9lwHzx/RdPqySwp5tDFdbc0xfH4mMLDaEJiKqjj7//HPHmJgYKwCwsbHJ02ge/ZXr5OSUO3HixITZs2eX6neYlZWVnDt3bsK+ffvOJyYmnvjuu+8uDB48+M758+ctZs+e7dOgQYMmderUaTRu3DjvDRs22GVnG/5q4YwZMzyXLl3qMWjQoDvffPMN79wqRpVMsHQsAdTS/TkayuXBdnrmtdU9RlRGUIZgb2WK9wcH4xIbQhMRVUsbNmywmzRpUp1nnnnmXr9+/e7+8MMPzsePH3+kEOLzzz+fMmHChHt+fn5PfNbJxsZGDhs2LHnNmjXXrl+/fioyMvLU66+/ft3T0zPrm2++cfnXv/4VEBMTo+/KT5nNmDHDMzw83GPgwIF3vv/++yv6kkZSqF3J3b2Y8a4AGkN3h6CuHMNmAE8LIYILzbOBskD+PIAjFR6wAXXwd8aYDn746uAV7Dtf5vWORERUxezevdt65MiR9Vq0aJG2cePGy++8885NIYScNWuW3puxDCU4ODhz/vz5CQcOHDh/+/btyG+//faCu7u7we7ue+WVVzzCw8M9BgwYcGf9+vVXtNrH1iat8dReg/WpriXObii1rywAtAQwDEAqgJmF5s4G0B3ATiFEOIAUKJXcvQD0lUZYwfO1XkHYdz4Rr/4QhR3TOsPeylTtkIiIqByOHTtmMXDgwAA/P78HW7duvWBpaSkbNWqUOWTIkMS1a9e67Ny50zokJOR+Wd8/MTFR+/bbb7uVdn737t2LrQv0ySef1Lp69ao5ANy9e9ckOztbzJo1ywMAfH19MydNmnQ3f+7ChQtdFi9e7Onh4ZHVvXv31M8++6xW4ffy8PDIef7551Oe/BtVX2onWN8B+A+AUQBcAEgoidZnAN6TUl7LnyilvCCE6ADgHQChAMwAHAfQq6q2ySmJhanSEPr5ZQfwv59PYenw5mqHREREZXT+/Hmzvn371rezs8vZsWPH+cJ39i1YsCBuw4YNTqGhod4hISFlXhty584dbXh4+CO9eoszduzYO25ubnoX+65evdrl6NGjNoXH3nvvPU8AaN26dVrhBCsiIsIaAOLi4symTJniV/S9WrduncYE62GqJlhSyvUA1j/B/LMAnqu4iCpfk9r2eLl7ABbvikWPhm54Ntiz5BcREVGVExAQkHXr1q0offv8/PyyMzIyTpT3MwIDA7OklMfK+z4AcOTIkZjSzv3pp5+uQKlRSaXE1WlVwP97uh6a+zhg7sZo3Ep+UPILiIioWsjJyUF6errIzs4WUkqkp6eLou11yDgxwaoCTLQaLBnSDNm5Eq/+eBJ5eUa3nIyIiMpg2bJlTtbW1i3GjRtXNy4uzsza2rqFv79/Y7XjovJjglVF1HG2xpy+DbDvfCK+ZkNoIqIaYerUqXeklMcKbyUVGyXjwASrCvl3Gx88HeiChdvO4kICG0ITEREZKyZYVYgQAov+1RQWplrMWB+J7NxKby1FREREBsAEq4pxtbPA2883QdTfyfh49wW1wyEiIqIyYIJVBfVp4oHnm3vh4z0XEHk9Se1wiIiI6AkxwaqiXn+2EdxszTFjHRtCE5HxM8JmG0SPVdLPNBOsKsreUtcQOvE+Fm47q3Y4RERlJoS4l5WVxV5gVK1kZWWZCiHuFbefCVYV1t7fGeM61sGaQ1fxRywbQhORccrLy9uWlJRkq3YcRIaUlJRkm5eXt624/UywqrhXewYiwNUGr/5wEknpWWqHQ0T0xHJzc1fEx8cnxcfH18rMzDTl5UIyVlJKZGZmmsbHx9eKj49Pys3NXVHcXLWbPVMJLEy1CB/aDAM+OYA5m07h4+HNIQS7KBCR8WjZsuWVY8eODYyLi5sQHx/fW0rprHZMRGUlhLiXl5f3fW5u7oqWLVteKW4eEywj0NjLHtOfqY/3dsQgpKEbnmvmpXZIRERPRPeL6L+6jaja4yVCIzGxc1208HHA/zadQlxyhtrhEBER0WMwwTIS+Q2hc/IkXvmBDaGJiIiqMiZYRsTP2Rpz+zbEgQt3sPrQFbXDISIiomIwwTIyw5/yRrcgV7yz7RwuJKSqHQ4RERHpwQTLyAgh8M6/msDKTIvp606yITQREVEVxATLCLnaWmDhwCaIvpGMj34/r3Y4REREVAQTLCPVq7EHBrbwwid7L+L4tWIr9RMREZEKypxgCSEGCSE+EEKMFUKYFNn3a/lDo5K8/mwjuNtZYMa6SKRn5agdDhEREemUKcESQkwG8DEAKwCvAjgghKhVaEonA8RGJbCzUBpCX72bjre3siE0ERFRVVHWM1iTAfSUUk4A0ARAJIDdhZIs9nKpJO3qOWFchzr45q9r2BOToHY4REREhLInWB5SypMAIKXMkVJOBLAbwB4hhBMAVsGsRK/0DER9NxvM+jEK9+6zITQREZHayppgJQoh6hQekFLOALBHt7HHYSXKbwidlJ6FOZuiwU71RERE6iprgvU7gNFFB6WU0wDsBWBR5oioTBp5Kg2ht0bfwqbIG2qHQ0REVKOVZw3Wu/p2SCmnAvAra0BUdhM710MrX0fM+/k0biaxITQREZFaSpVgCSGGFH4upcySUqYXN19Kea28gdGT02oEFg8JRi4bQhMREamqtGew1gohJlZoJGQQvk7WmNevIQ5evIMvD15ROxwiIqIaqbQJ1lcAlgkh5ujbKYRoJ4TYZ7CoqFyGtvZGjwaueHf7OZyPZ0NoIiKiylaqBEtKOR7AIgBvCiHC88eFEIFCiA0A9gNoXjEh0pMSQmDhwKawMTfBtHWRyMphQ2giIqLKVOpF7lLK2QBmAJgqhPhGCLEcQDSAvgA+AxBQMSFSWbjYmmPhwCY4fTMFS9kQmoiIqFI96V2En0OpczUCwIsAfgDQQEr5kpQyztDBUfn0bOSOQS1rY9neCzh2lQ2hiYiIKktp7yI0FUK8DOAigK4ATkCp1m4K4HrFhUflNb9/Q3jYW2LG+kjcz2RDaCIiospQ2jNY5wEsAXAbwLNSypYA/g3gWQBbhRA2ZflwIUR9IUSYEOIvIcRtIUSqECJSCDFHCGGtZ36gEGKTEOKeEOK+EGKfEKJbWT67prC1MMWSIcG4djcdC9gQmoiIqFKUNsHSQrkkGCyl/BUApJTroCRYbaH0IHQpw+ePBTAdypmxMACvAogB8BaAg0IIy/yJQoh6AA4CaAdlwf2rAGwA7BBC9CjDZ9cYbeo64cVOdbH28DXsOceG0ERERBWttAlWgJRylZTyodvRpJQ7AfQAUBfKnYRP6kcAtaWU/5ZSfiSlXC6lHApgAYCmAMYVmrsQgAOAnlLKhVLKZQA6AbgJ4BMhhCjD59cYM0PqI8jdFq/+GIW7bAhNRERUoUpbpuHBY/YdhpLoWBY35zGvjZBSJuvZtU732BgAdJcLnwWwV0oZWej1aQBWAqgPoPWTfn5NYm6ixZIhzZCckYX/bmBDaCIioopU1l6ED5FSngHQwRDvpVNb9xive2wKwBzAIT1z/9I9MsEqQUNPO8wMCcT207ew4TgbQhMREVUUgyRYACClNMjdhEIILYD/AcgBsFY37Kl71JcV5I95FfN+E4QQEUKIiNu3bxsiRKP2Yqe6eMqvFl7/5TRusCE0ERFRhTBYgmVAH0BZyD5PShmjG7PSPWbqmf+gyJyHSClXSClbSSlbubiUZR1+9ZLfEDpPSsxcH8mG0ERERBWgSiVYQog3AUwGsEJKubDQrnTdo7mel1kUmUMl8K5lhfn9G+GvS3ex6sBltcMhIiKqdqpMgiWEeB3AXABfAvi/Irtv6h71XQbMH+OioicwuFVt9GjghkU7YhDLhtBEREQGVSUSLF1yNR/AagDj5aO3uEVDuTzYTs/L2+oeIyoswGpICIF3/tUEtuYmmPY9G0ITEREZkuoJlhBiHpTk6msAY4vW2gL+KcewGcDTQojgQq+1ATAeSqX5I5UTcfXhbKM0hD4Tl4IPfotVOxwiIqJqw0TNDxdCTALwBoBrAH4DMKJIvdB4KeUu3Z9nA+gOYKcQIhxACpTq8l4A+uo560WlENLIHUNa1cbyPy6iW5ArWvnVUjskIiIio6dqgoWC2lU+UC4PFvUHgF0AIKW8IIToAOAdAKEAzAAcB9BLSvlbJcRabc3r3wiHLt3BjPUnsfXlTrAxV/vHgoiIyLipeolQSjlaSikesz1dZP5ZKeVzUkoHKaWVlLIjk6vyszE3weLBzXD9XjoW/HpG7XCIiIiMnuprsKhqeKpOLUzoXBffHbmO38/Gl/wCIiIiKhYTLPrHjGeUhtCv/RSFO2n6aroSERFRaTDBon+Ym2jxwbBmSMnIwX83siE0ERFRWdXIBGvv3r0QQjy0WVhYoG7duhgzZgzOnj2rdoiqCXK3wys962PH6Xj8xIbQREREZVKjbxcbPnw4+vTpAwDIyMhAVFQUVq5ciZ9++gnR0dHw9fVVOUJ1jOtYF7+dTcDrv5xGmzq14F1Lb5tHIiIiKkaNTrBatGiBkSNHPjQWEBCAl19+GRs2bMD06dNVikxdWo3A4sHB6P3hPsz84SS+e7FtyS8iIiKif9TIS4SP4+npCQAwMzNTORJ1KQ2hG+LI5bv4Yv8ltcMhIiIyKjX6DFZ6ejoSExMBKJcIT506hTlz5sDZ2Rn/+te/VI5OfYNa1sauM/F4f0csHHxzYWWmVTskIiIio1Cjz2DNnz8fLi4ucHFxgY+PD/r06QMTExPs27cP7u7uaoenOiEEFg5sAjtLE1xISEMe7yokIiIqlRqdYE2YMAG7du3Crl27sHnzZrz77rtITExEnz59cPXqVbXDqxKcbMzxzsCmSM/Kwd/3MtQOh4iIyCjU6EuEAQEB6NGjxz/P+/Xrhy5duqBt27Z47bXX8P3336sYXdXRo6EbXG0tcDM5A0ev3EVrNoQmIiJ6rBp9BkufNm3awN7eHrt371Y7lCrF18kKFiZazFgfibTMHLXDISIiqtKYYOmRk5OD1NRUtcOoUrQagXouNrhxLwNvbmZDaCIiosdhglXErl27cP/+fbRs2VLtUKocWwsTTOxSD+sirmPXGTaEJiIiKk7NWoP1IAm4n/jP0+PHj+Obb74BAGRmZuL06dNYsWIFTE1N8dZbb6kUZNU2vUd97I25jdCfotDcpzOcbczVDomIiKjKqVkJ1t3LwHv1kHvHDQDw3Xff4bvvvgMAaDQaODk5ISQkBLNnz0br1q3VjLTKMjPR4IOhzdD/o/2YvSEaK0a1hBBC7bCIiIiqlBqVYKWae+CUR280sotBVlgqTHPTAQB5trUh/NpD+HUAfNoDzgEqR1q1Bbrb4tWegViw9Sx+OPY3hrTyVjskIiKiKqVGJVi5WgskBv4biQByc7JglnQRdvdOwfl+LJzO7oBF9HoAQJ6lE+DbHhq/DoBve8CtMaBhFfPCxnWsg9/PxeONX06jXV0nNoQmIiIqpEYlWIVpTcyQ69wA95wb4B6AmNxcaFOuwu5uNJzux8Lp0l+wPrcZAJBnZgN4t9ElXB0Az+aASc1ee6TRCLw/OBi9P9iHmetP4rsJbaHV8FIhERERUIMTrKI0Wi2kY10kO9ZFMoCLUgIpN2FzNwrOaTFwunEOdhd/BwBIrTmkZ0to6nQEfNsBtZ8CzG3U/QIqqO1ohdefbYSZP5zEyn2XMLFLPbVDIiIiqhKYYBVDCAHYe+G+vRfuozeuSAl5PxE2d6NRKzUGTokxsL/+PjTIgxRa5Lk1gaZORwjfDoBPW8CqZlQ7H9jCC7vOxGPxzlh0ru+CBh52aodERESkOiZYpSSEgLBxQbpNN6SjG65LibwHKbC+exqOKWfhlBoDx78+g/bQxwCAXOdAaPw6Qvi2V9Zx2Xmq/A0qhhACbw9sgpDwPzF9XSR+ntwB5iZcr0ZERDUbE6wyEkJAa2mPB17tEefVHnEAcrMyYHHnDBxTzsApLQa1jq+FacQXAIBce5+HE65adQEjLW+wd+9edO3aVe8+i+mAVqtFTg7b6RARUc3FBMuAtGaWyPZoiQSPlkgAkJeTBdO7sXBIOg2n+zFwOr0Z5ifXAgDyrFwAvw7Q+HUEfNoBrg0BjXEV1h8+fDj69Onzz/N1R6/jr0t3MKU7y1wQEVHNxgSrAmlMzJDr2hh3XBvjDoC83Fxoky4VlIY4vw9WZzYBAPLM7QDvtsrCeZ/2gGczQGuqZvglatGiBUaOHPnP8+cH56DP0n3YmSkx/UE2bC2qdvxEREQVhQlWJdJotZBOAUh2CkAygPN5edCk3oDt3Wg4pcXA6Xo0bC/sBABIE0vI2q2UM1y+7QGvVoBZ1a41ZW1ugiVDmmHw8oMI23wG7w0OVjskIiIiVTDBUpFGowHsvZFq741U9MFlKYG0BFjnJ1zxMbC/8g4EJKTGFHnuwdD4dVAqznu3ASwdVI0/PT0diYmJD435WgNjWrvhiyN/45mGbghp5K5SdEREROphglWFCCEAWzek27ohHT1wTUrIjCRY3TmFWqln4ZQcA8dDH0Mc/BASAnkuDXSlIdorlxVt3So13vnz52P+/PmPjPfu0weNeoZi9oZoNPdxhIttzS7KSkRENQ8TrCpMCAFh5YgHVp1wE51wQ0rkZd6H1d0zcEg5q9ypGLEaJkdWAAByHesqZ7h8OygFUB18K/ROxQkTJmDw4MGPjLu4uMDKvS76frQfszdE4fP/tGJDaCIiqlGYYBkRIQS0FjbI9HwK8Z5PIR5AbtYDmN+LgUPyaaXFT9QGmJ34GgCQZ+PxcE9F50CD3qkYEBCAHj16FLt/Vs9AvPXrWayPuI6hrX0M9rlERERVHRMsI6c1s0COWzAS3YJ1TayzYZp0CfZJp+CUFgun2N2wPP0TACDPwhHwbQeNry7hcm8KaCvuR2Bshzr4/WwCwjafQbu6zvBxqtqL9ImIiAyFCVY1ozUxRZ5zIO45B+IegNjcXGhTrsH27imlFteVY7CJ2QoAyDO1Bmq3LigN4dUSMLUwWCwajcD7Q4LRK/xPzFgfiXUT27EhNBER1QhMsKo5pYl1HaQ41kEK+uOSlEBqHGzuRitnuOLOwf7yXgCA1JhCeraA8OsI4ddeuVPR3LZcn+/lYImwAY0wfd1JrPjzEv7f02wITURE1R8TrBpGCAHYeeK+nSfuoyeuSgmZfhfWd6JRKy0GTndj4HDjA4j9iyGFBnmujZU1XOl3APOHGzkfP34c33zzjd7PGTBgAGxsbJQ/N1MaQi/ZFYPO9Z3RyNO+wr8nERGRmoSUUr0PF2I2gBYAWgKoA+CqlNLvMfPbAFgAoA0ACeAggFApZWRpPs/f31+uXLmynFFXb1JK5GWmwerOKaWJ9f1Y1Lp/Ad1lEgBgr3ML7E3xRtc5Gx77PufPn4e/v/8/z+/dz0LIB3+ilpUZfp7cARambAhNZCyEEMeklK3UjoPImKh9ButtAHcBHAfg8LiJQoi2APYCuAFgnm54MoB9Qoj2Usroiguz5lDuVLRFplc73PJqh1tQmlgnR06BSc59SEdfPJ16GHK+7myWvY+yYN63HeDbAXDy11sawtHaDIsGNcWYL49i8c4YzOnbsHK/GBERUSVSO8GqJ6W8BABCiFMAbB4zdymALACdpZQ3dK9ZD+AsgMUAQio41hpLa2YJaWaDDI0FMGI9IPOA+NPAtUPA1QPAxd+BqO+VydYuSvPq/Fpcbo0BjXK2qmugK/7dxgcr919G9wZuaFvXScVvRUREVHFUTbDyk6uSCCH8AbQGsCo/udK9/oYQ4gcAY4QQ7lLKWxUUKhWm0QIeTZWtzURASuDORSXZyk+6zv6izDW3UxbL+7YHfDtgTq8mOHAhETPXn8S2aZ1gx4bQRERUDal9Bqu0WuseD+nZ9xeAsVDWcf1aaRFRASEAZ39la/mCMpb8N3D1UEHS9fsbAAArEwtsdm6GL//2wNq1l/F/I4cBZtYqBk9ERGR4xpJgeeoeb+jZlz/mpe+FQogJACYASgsXqiT2tYGmg5UNAO7f0Z3dOgjbawcx2eRnaK5tRN7CWdB4BitnuHzaAz5tAata6sZORERUTsaSYOWXAM/Us+9BkTkPkVKuALACUO4iNHxoVCrWTkCDfsoGIDc9Ca9/uho+aSfxH9yA2eEVwMGPlLmuDXUJl24tl52HioETERE9OWNJsNJ1j+Z69lkUmUNGwNTKAf8ZNRZ9l+7HQVNnfBHaGOLmCeWS4tVDwMnvgaO6khqOdXRruHRJV626FdrEmoiIqLyMJcG6qXvUdxkwf0zf5UOqwvxdbfFaryCEbTmD70/cxvCndEkUAOTmAPHRwNWDyhazDYj8Vtln416QcPm2B1waGLSJNRERUXkZS4J1VPfYDkDRSqFtoRQdPVapEZFBjG7vh9/PxePNLWfQvp4TfJ10C961JoBnc2VrN0m5U/F2DHDtYEHSdVpX7NTCQXc5UXdJ0SMY0PLuRCIiUo9RJFhSygtCiAgAg4UQ/5NS3gQAIYQngMEAdrNEg3HSaATeGxSMnh/8iRnrT2J9cQ2hhQBcg5St1Vgl4Uq6piRa+UlX7DZlrqkVULt1QS0ur1aAmd4lekRERBVC1QRLCDEKgK/uqQsAMyHEXN3zq1LKrwtNfxnAHiiV23WroTEFgAbAzMqIlyqGp4Ml3hrQGC9/H4nlf1zEpK7+Jb9ICMDRV9maDVfG0hJ0CZeuPMTehQAkoDFVzoTpanHBpw1gwX6IRERUcdQ+gzUOQJciY2/qHv8A8E+CJaU8KIR4GsBbui2/F+FgKeXJCo+UKtSzwZ7YeSYe4bti0aW+Cxp7lSEBsnEFGg1QNgDISAKuHymoxXXoE+DABwAE4N5YKQuRv47LxtVg34WIiEjtSu5PP+H8QwC6V0w0pCYhBBYMaIyjl+9i+rpIbJ7SsfwNoS0dgPohygYAWenAjWO6NVwHgBNfA0c+U/Y5+RfU4vJtDzj48E5FIiIqM7XPYBH9w8HKDO8NDsYLq47g/R0xmNvPwA2hzayAOp2UDQBys4G4kwWL5s/8DBxfo+yz8ypUGqI94BLIhIuIiEqNCRZVKV3qu2BUW1+s3H8Z3Rq4on0954r7MK0pULuVsnWYCuTlAbfPFiRcl/cB0T8oc62cdHcq6pIutybKnY5ERER68DcEVTmz+wRh/4VEvLL+JLZP71x5DaE1GsCtkbI99aJyp+LdS/+0+MHVg8C5LcpcMxtdE2tdaQjPFoCpxePfn4iIagwmWFTlWJmZYMmQYAxafgiv/3waS4Y2UycQIQCnesrWfKQylhJXqBbXIWD3W8q41kwpB+GrO8vl3QYwt1UnbiIiUh0TLKqSmvs4YlJXfyz9/TyeaeiG3k2qSD9COw+g8b+UDQDS7wLX/ipIuvZ/AOxbDAgN4N60oBaXT3ulHyMREdUITLCoyprSzR97YxLw343RaOnrCFe7KngJzqoWENRH2QAgMw34+2hBPa6IL4C/PlH2uQQVNLD2bQfY11YvbiIiqlBMsKjKMtVqsGRIM/Rdug+zforCl6NbQ1T1O/nMbYB6XZUNAHIygZuRBbW4Tv0EHPtS2efgU6gWVwflUmRV/35ERFQqTLCoSvN3tcHs3kF4ffMZrD1yDf9u41vyi6oSE3OlcrxPG+V5Xi4Qf0pZv3X1AHDxdyDqe2WftcvDtbjcGgGactYCIyIiVTDBoirvP+388Pu5BLy15Sw61HOGn7O12iGVnUarNKP2CAba/p9yp+KdC0qydfVQQT0uADC3VxKz/KTLszlgYqZu/EREVCpMsKjKy28IHRL+B6avj8QPE9vBRKtROyzDEAJwDlC2lqOVsaTrD5eGOL9TGTexVGp2+bZX1nJ5PwWYGXGySURUjTHBIqPgbm+BNws1hJ7cLUDtkCqOg7eyNR2iPL+f+HDC9ed7gMwDNCaAR7OCWlzebZRF90REpDomWGQ0nmvmhd/OJuCD386jS31XNKldhobQxsjaGWjQX9kA4EEK8PeRgoTr8GfAwY+Ufa6NdIvmdaUh7KpIeQsiohqGCRYZlTefa4Qjl+9g+vpIbDFEQ2hjZGEH+PdQNgDIfqA0sc6vxRW5Fjj6ubLPsU5BWQjf9spz3qlIRFThmGCRUXGwMsP7g4Mx6osjWLQ9BvP6G7ghtDEytQD8OigbAOTmALeiCmpxxWwFIr9R9tm4F/RT9G0PuDRQWgQREZFBMcEio9MpwAUvtPPFqgOX0b2BKzr4V2BDaGOkNQG8Wihb+8lKE+vEmIJLilcPAqc3KHMtHAo1se4AeDRVmmATEVG5MMEioxTauwH2XUjEKz+cxPZpnWFvyaSgWBoN4NpA2VqPU0pDJF0tqMV17RAQu02Za2ql3J2YX4urdivA1FLd+ImIjBATLDJKlmZahA9phoGfHsTrv5xGuFoNoY2REICjn7I1G66Mpcbr1nDp7lbcuxCABDSmypmw/FpcPm0AixpycwERUTkwwSKjFeztgCnd/PHBb+fRo4Eb+jblHXNlZusGNHpe2QAgIwm4frigAOrBj4D94QAE4N5Yt3Bel3TZuKgZORFRlcQEi4zapK7+2BNzG3M2RaOVnyPcqmJDaGNk6QDU76lsAJCVDtyIKFjDdWw1cHi5ss8poKAWl297pcciEVENxwSLjJqpVoPwIcHos3QfXv0xCqvHGEFDaGNkZgXU6axsAJCTBcSdLCgNceZn4PgaZZ9d7YJaXL4dAOf6LA1BRDUOEywyenVdbPDfPg0w7+fT+ObwNYxqa2QNoY2RiRng3VrZOrys3KmYcEZXcf4AcPkPIHq9MtfKqdCdiu0BtybKnY5ERNUY/5WjamFUW1/8djYBb/96Fh3qOaGui43aIdUsGo2yNsu9MfDUi8qdincvFdTiunoAOLdFmWtmq9ypmJ9webZQankREVUjTLCoWhBC4L1BTRES/iemrz+Jn/6vGjWENkZCAE71lK3FKGUs5WbBGq5rh4DdbyrjWnPAq2VBwuX9FGBuq17sREQGwASLqg03Owu8NaAxpnx3Asv2XsTU7tW4IbQxsvMEmgxSNgBIv/twE+v94cC+9wGhVQqe5tfi8mkHWDupGzsR0RNigkXVSv9gT/x2Nh5Lfz+PpwNd0LS2g9ohUXGsagFBfZUNADLTdE2sdUnX0ZXAX58o+1yCCspC+LYH7L3Ui5uIqBSYYFG1E/ZsYxy+dBfT10Xi16mdamZDaGNkbgPU66ZsAJCTCdw8UVCLK+oHIGKVss/B5+FaXE71eKciEVUpTLCo2rG3MsX7g4Mx8ovDeGfbObz+bCO1Q6KyMDEHfNoqWycAebnAreiCRfPndwEnv1PmWrsWlIXwaQe4NQI0TKyJSD1MsKha6hjgjNHt/fDVwSvo3sAVnQJYbdzoabSAZzNla/v/lDsVE88X1OK6ekipxwUA5vZKYpafdHk0U0pLEBFVkhqdYKWmpmLQoEHIysrC7NmzERISonZIRmHv3r3o2rXrP881Gg3s7Ozg5eWFli1bYvjw4ejZs6fqBT9Dewdh3/nbePWHKOyY1hn2VmwIXa0IAbjUV7aWo5WxpGtKopWfdJ3foYybWCqNq307KElX7daAmbVqoRNR9VejE6zffvsN2dnZ8PDwwLZt25hgPaHhw4ejT58+kFIiNTUVMTEx2LRpE9asWYMePXrghx9+gIODg2rxWZhqET60GQYuO4h5v5zCh8OaqxYLVRIHH2ULHqo8T7tdcKfitYPAn4sAmQdoTJSzWvmlIXzaApaOqoZORNVLjU6wtm7dimbNmqFDhw745JNPcPPmTXh6eqodltFo0aIFRo4c+dDYkiVLMGvWLCxZsgTDhw/Htm3bVIpO0bS2A6Z2D8CSXbHo0cAN/YP537dGsXEBGj6rbADwIAW4fkS3cP6g0k/x4FIAAnBtWJBw+bYHbN1VDZ2IjFuNrcQYGxuLCxcuoGfPnujRowe0Wq3qyUB1oNVqsXjxYnTs2BHbt2/H/v371Q4JLz1dD828HTB30yncSn6gdjikJgs7IKAH0GM+MG4HEHoNGP0r0HUOYOMKRK4FfhwDLA4EljYHNk0CTnwL3L2srPkiIiqlGptgbd26FZaWlujcuTPs7e3Rrl077NixA3l5eWqHVi2MGzcOAPDrr7+qHAlgotVgyZBgZOXk4dUfT0LyFyXlM7UE/DoCXV4F/rNJSbhe3A2ELABcGgAxvwI/vwQsbQYsaQD8OBY48jkQf0bpv0hEVIwaeYkwKysLv//+Ozp37gxLS0sAQEhICPbt24ejR4+iTZs2Kkdo/Jo2bQpAOVNYFdR1scF/+zbA/zadwtd/XcV/2vmpHRJVRVoTpW2PV0ug/WQliUqMKajFdfUgcOonZa6lY0ETa5/2SvV5LW+kICJFjUyw/vzzT6SlpaFnz57/jLVt2xYODg7Ytm0bEywDsLOzAwCkpKSoHEmBkW188NuZeLy99Sw6+DujHhtCU0k0GsC1gbK1Hq9cJrx3paAW19VDQMxWZa6pNeDduqAAqldL5QwZEdVIRpVgCSE0AF4GMBGAH4DbANYDmCelvF/a99m6dSscHBzg4uKCGzdu/DPeqlUr/PHHH0hOToa9vb1hg69h8hOr/ESrKvinIfQHf2LGukj8+P/aw5QNoelJCAHUqqNszUYoY6m3ChpYXz0I7HkbgAQ0prom1rpaXN5PARb8d4WopjCqBAtAOICpADYCWAygge55cyFEDylliYsi4uLiEBkZCSklRo0apXfOrl27MGjQIAOGXfNERUUBAAIDA1WO5GGudhZYMKAJJq09jk/2XMC0HvXVDomMna070HigsgFAxj3g2uGCWlwHP1IaWQsN4Na4oBaXT3vlLkciqpaMJsESQjQCMAXABinlvwqNXwawFMAwAGtLep9t27ZBSolXXnkFNjaPXiL64osvsG3bNiZY5fTFF18AAPr27atyJI/q29QDv531wke7L6BroCuCvR3UDomqE0tHILCXsgFA1n3g74iCWlzHvgIOf6rscwp4uDSEg49qYRORYRlNggVgOAAB4IMi458DeAfASJSQYEkpsWPHDtStW7fYX/xXrlzBV199hXPnziEoKKj8Udcwubm5eO2117B//3706dMHHTp0UDskvV5/thH+unTnn4bQlmbsW0cVxMwaqNtF2QAgJwuIO1lQi+v0JuD4amWfvXfBwnnf9oBzfTaxJjJSxpRgtQaQB+BI4UEp5QMhRKRu/2NlZGQgISEBISEhyMzM1Dunbdu2+Oqrr7B582bUqVPHAGFXD/rKVxw/fhzffPMNADxUyf3q1asICQnB2rUlnlBUjb2lKRYPDsaIlYfxzrazeOO5xmqHRDWFiZmyGN67NdBxmtLEOuGM7i7FA8DlP4Do9cpcK2ddT0Xdwnn3JmxiTWQkhLHUBBJCRANwlVK66dm3HsBgAOZSyqwi+yYAmKB72gKAsLa2TtBqtTnFfVZqaqqrlFJra2sbp3Y/vYqSlZVlZWZmlv4kr8nLy8tNS0tLAGALoOjipVwA2QDuA7gLoOrcPlgyZwCJagdRRfBYFOCxKBAopbRVOwgiY2JMZ7CsAOg/7QQ8KDTnoQRLSrkCwAoAEEJESClbVViERkQIEZGRkcFjAf5cFMZjUYDHooAQIkLtGIiMjTHdo54OwLyYfRaF5hARERGpypgSrJsAnIUQ+pIsLwCJRS8PEhEREanBmBKso1DifarwoBDCAkAzAKU5hb3C8GEZLR6LAjwWBXgsCvBYFOCxIHpCxrTIvQmAkwA2FqmDNQVKHaxRUspv1IqPiIiIKJ/RJFgAIIT4CMBkKJXct6KgkvsBAN1KU8mdiIiIqKIZW4KlBTANStkFPyi3UK+D0oswTb3IiIiIiAoYVYJFREREZAyMaZH7ExNCaIQQ04UQ54QQD4QQ14UQi4UQ1mrHVpGEELOFED8IIS4JIaQQ4koJ89sIIX4TQqQKIVKEENuFEM0qJ9qKI4SoL4QIE0L8JYS4rft+kUKIOfp+BoQQgUKITUKIe0KI+0KIfUKIbmrEbmi67/atEOKsECJZCJGu+3uxRAjhUcz8anksihJCWBX6u/Kxnv3V+ljovre+7ZGrAtX9WBAZkjEVGi2LcChrtDYCWIyCNVvNhRA9qvGarbehVFM/DsDhcROFEG0B7AVwA8A83fBkAPuEEO2llNEVF2aFGwtgEoBfAHwLpdJ8VwBvARgihGgrpcwAACFEPQAHAeQAWAQgGcCLAHYIIXpLKX9TIX5Dqg3AA8rfhb+hfM8mUC63DxNCNJNSJgA14lgUFQbARd+OGnQs9uHROwWzCz+pQceCyDCklNVyA9AISu/Cn4qMTwEgAYxQO8YK/O51C/35FIArj5l7BEpbG69CY166sZ1qf5dyHodWAOz1jL+l+xmYXGhsPZR2P80KjdkAuAogBrrL6dVtg9JiSgKYVROPBZT2WTkAZuiOw8dF9lf7Y6H73l+VYl61PxbcuBlyq86XCIcDEAA+KDL+OZSK7yMrO6DKIqW8VJp5Qgh/KE2yf5BS3ij0+hsAfgDQQwjhXjFRVjwpZYSUMlnPrnW6x8YAoLtc+CyAvVLKyEKvTwOwEkrfxRKbiRupq7pHR6BmHQvdTTOfA9gOYIOe/TXmWACAEMJMCGFTzL4adSyIDKE6J1itoZzBOlJ4UEr5AEAk+I8BUHAMDunZ9xeUBLVl5YVTaWrrHuN1j02htGEq7jgA1eTnRQhhIYRwFkLUFkKEAPhMt2ur7rHGHAsA0wEEQbkkrk9NOhaDoPyPZ6oQIkEI8ZEQwr7Q/pp0LIgMojqvwfKE0j5HX4PoGwDaCyHMZM1ur+Ope7yhZ1/+mFclxVIpdGct/gflstBa3XBNOg7jAXxU6PkVACOllPt0z2vEsRBC1AHwBoAwKeUVIYSfnmk14lhA+Z/QHwBcAGAHoA+UpLOLbh1mGmrOsSAymOqcYFkB0JdcAcCDQnNqcoJlpXvUd5weFJlTXXwAoB2A/0opY3RjNek4bAJwDsrameZQLvs4F9pfU47FcgCXACx5zJwacSyklG2KDK0RQkQBWADgZd1jjTgWRIZUnROsdACuxeyzKDSnJsv//voaaFe7YySEeBPK/5mvkFIuLLSrxhwHKeXfUO4iBIBNQoifABwVQljpjkm1PxZCiJEAngHQWUqZ/Zip1f5YPMZ7AOYD6AslwarJx4KoTKrzGqybAJyFEPr+QfCCcvmwJp+9ApRjBOg/tZ8/pu+SgNERQrwOYC6ALwH8X5HdNeY4FCWljAJwAsBLuqFqfSx0/x4sgbLm7JYQwl93s4evboq9bswB1fxYPI4u8byJgrObNfZYEJVVdU6wjkL5fk8VHhRCWABoBiBChZiqmqO6x3Z69rWFcvv2scoLp2Lokqv5AFYDGC+lLNq+IBrKpY/ijgNQvX9eLAHU0v25uh8LSyg1r/oCOF9o26vbP1L3fDyq/7Eolu7fydoouBGkxh4LorKqzgnWOigJwrQi4y9CWSvwbWUHVNVIKS9A+UdxsBAifxErdH8eDGC3lPKWWvEZghBiHpTk6msAY6We4rK6RbybATwthAgu9FobKL9oz6PI3ajGprhyG0KIrlDKVfwF1IhjcR/Kz3bRLf8M3nbd819qwLGAEMKpmF1vQllCshmoET8XRAZXrXsRCiE+grLmZiOUSwL5ldwPAOim75dtdSCEGIWCSx5TAJhBqWQPAFellF8XmtsewB4o63I+KvQaNwAdpJQnKyXoCiCEmATgYwDXoNw5WPS/d7yUcpdurj+UXxDZUDoApEBJxpsA6Cul3FFZcVcEIcRGKJXcd0OpfWUBpQTHMChrZ57Or29U3Y+FPrq7CC8D+ERKObnQeLU+FkKIcChnoPZA+XtiA+Uuwq4ADgPoKgu6HVTrY0FkcGpXOq3IDYAWwEwoVYYzoawRWALARu3YKvh774Vy9k7ftlfP/HYAfgeQBiAVwA4ALdT+HgY4Dl895jg8ciygJOA/A0iCknTsB9BD7e9hoGMxBMAWANeh3PWVAeVuwo8A+OiZX22PRTHHxw96KrlX92MB4Dnd3/cbup+L+1DqBP4XgEVNOhbcuBl6q9ZnsIiIiIjUUJ3XYBERERGpggkWERERkYExwSIiIiIyMCZYRERERAbGBIuIiIjIwJhgERERERkYEywiIiIiA2OCRURERGRgTLCIiIiIDIwJFhEREZGBMcEiqgRCCEshxN9CiGtCCPMi+1YKIXKFEMPUio+IiAyLCRZRJZBSZgCYD8AbwEv540KIhQDGAZgipfxepfCIiMjA2OyZqJIIIbQATgJwBVAXwHgA4QDmSynD1IyNiIgMiwkWUSUSQvQDsBnAbgBdAXwspZyqblRERGRoTLCIKpkQ4jiA5gC+BzBCFvlLKIQYAmAqgGYAEqWUfpUdIxERlQ/XYBFVIiHEUADBuqepRZMrnXsAPgYwp9ICIyIig+IZLKJKIoQIgXJ5cDOAbACDATSRUp4tZv4AAB/wDBYRkfHhGSyiSiCEaANgA4ADAP4NYC6APAAL1YyLiIgqBhMsogomhGgIYCuAWAADpJSZUsqLAL4A8JwQooOqARIRkcExwSKqQEIIHwA7oKyr6i2lTCm0+00AGQAWqREbERFVHBO1AyCqzqSU16AUF9W37yYAq8qNiIiIKgMTLKIqRleQ1FS3CSGEBQAppcxUNzIiIiotJlhEVc8oAF8Wep4B4CoAP1WiISKiJ8YyDUREREQGxkXuRERERAbGBIuIiIjIwJhgERERERkYEywiIiIiA2OCRURERGRgTLCIiIiIDIwJFhEREZGB/X+tVTiwPOHKSQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Alias to use numpy library functions\n", "import numpy as np\n", "import matplotlib\n", "# Alias to use matplotlib\n", "import matplotlib.pyplot as plt \n", "# Inline is used to get the output of matplotlib to the output of the cell\n", "%matplotlib inline \n", "\n", "# Construct lines, x represents our decision variable x1 and y represents our decision variable x2\n", "# x > 0\n", "x = np.linspace(0, 100, 2000) #2000 numbers from 0 to 100\n", "# y1 represents the line of constraint 2x1 + x2 <= 40\n", "y1 = -2*x + 40\n", "# y2 represents the line of the constraint x1 + 3x2 <= 45\n", "y2 = (45-x)/3.0\n", "# x2 represents a constraint at y2 <12 used for convenience\n", "x2 = (12 - x*0)\n", "\n", "\n", "matplotlib.rcParams.update({'font.size': 18})\n", "\n", "#1. Make plot\n", "plt.plot(x, y1, label=r'$2x_{1} + x_{2} \\leq 40$') #Plot y1\n", "plt.plot(x, y2, label=r'$x_{1} + 3x_{2} \\leq 45$') #Plot y2\n", "plt.axvline(x=12, label=r'$x_{1} \\leq 12$', c='g') #plot y3\n", "\n", "#2. Adjust axis\n", "plt.xlim((0, 50))\n", "plt.ylim((0, 45))\n", "plt.xlabel(r'$x_{1}$')\n", "plt.ylabel(r'$x_{2}$')\n", "\n", "#3. Fill feasible region\n", "y4=np.minimum(y1, y2) #line representing the maximum between y3 and y2\n", "plt.fill_between(x, y4, 0, where=x<12, color='grey', alpha=0.5) #fill where y5 ys greater than y6\n", "\n", "#4. plot legend\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n", "\n", "#5 Annotate graph\n", "plt.annotate('A', xy=(0, 0))\n", "plt.annotate('B', xy=(0, 15))\n", "plt.annotate('D',xy=(12, 0))\n", "plt.annotate('E', xy=(12,11))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The feasible region (in grey) contains all possible solutions to the objective function. \n", "\n", "Let us now represent the same problem in a basic Tableau:\n", "\n", "| z | $x_1$ | $x_2$ | $s_1$ | $s_2$ | $s_{3}$| RHS | \n", "|---|--------|--------|--------|--------|--------|-----|\n", "| 1 | -300 | -250 | 0 | 0 | 0 | 0 |\n", "| 0 | 2 | 1 | 1 | 0 | 0 | 40 |\n", "| 0 | 1 | 3 | 0 | 1 | 0 | 45 |\n", "| 0 | 1 | 0 | 0 | 0 | 1 | 12 | \n", "\n", "From the Tableau, we can easily find a first Feasible Basic Solution (FSB), by making $x_{1}$ and $x_{2}$ non basic (=0). \n", "The three equations of the constraints provide us the value of the slack variables in this solution:\n", "\n", "$x_{1} = 0 \\\\\n", "x_{2} = 0 \\\\\n", "s_{1} = 40 \\\\\n", "s_{2} = 45 \\\\\n", "s_{3} = 12$\n", "\n", "Let us note this solution as (0,0,40,45,12) and z=0. Note that this FSB corresponds to Vertex A in the figure.\n", "How can we know if it is optimal?\n", "We have 2 non basic variables $x_{1}$ and $x_{2}$ which have negative coefficients in the objective function and positive values of this variables would increase z. If we increase $x_{1}$ in one unit, z would increase 300 units and if we increase $x_{2}$ in one unit z would increase 250. Therefore, the solution is not optimal, since we could find a higher z for a positive value of these variables in the objective function. \n", "Hence, this is not the optimal solution and we need to look for it in another vertex. From point A, we could either move to vertex B or to vertex D. \n", "Moving towards D would mean making $x_{1}$ higher than zero, thus making it a **basic variable**. Likewise, moving towards B would mean making $x_{2}$ higher than zero and basic (enter the base). We select $x_{1}$ as the **entering** basic variable, since its coefficient (300) is higher and therefore z will increase at a higher rate when we move towards D. We have just selected the pivot variable and the pivot column in the Tableau.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, we are going to move towards D, which is equivalent to make $x_{1} = \\delta$. As this value increases, the objective value will also increase, but we have to bear in mind that all variables must be positive and therefore $\\delta$ cannot take any given value: we have to make sure the solution is **feasible**. If we write down all the constraints in algebraic form, we can find the possible values of $\\delta$ \n", "\n", "$2*\\delta + 1*0 + s_{1} = 40 \\\\ \n", "1*\\delta + 3*0 + s_{2} = 45 \\\\\n", "1*\\delta + s_{3} = 12$ \n", "\n", "To ensure that all the surplus variables are positive $\\delta$ cannot exceed the maximum positive value that guarantees that all the surplus variables are non negative. Out strategy to find a feasible solution is to make on slack variable **non-basic** (equal to zero), but making sure that all the constraints are met. \n", "Since we only have $\\delta$ and a slack variable in each expression, making the corresponding slack variable equal to zero is equivalent to making $\\delta\\ equal to the RHS divided by the coefficient, which means that the maximum value it can take is $\\delta = min(40/2, 45/1, 12/1)$. Any value above this makes the solution unfeasible. This is called the **Ratio test**. If we make $x_{1} = \\delta = 12$ then that implies that $s_{3}$ is now a non-basic variable. With the Ratio test, we have selected $s_{3}$ as the **leaving** variable which will no longer be basic in the FSB.\n", "Let us add two new columns to the basic Tableau, one to the right to indicate which variable is the basic variable in the equation and another one to the left to express this Ratio test.\n", "\n", "|Basic | z | $x_{1}$ | $x_{2}$ | $s_{1}$ | $s_{2}$ | $s_{3}$ | RHS | Ratio | \n", "|-------|---|---------|---------|---------|---------|---------|--------|----------|\n", "| - | 1 | -300 | -250 | 0 | 0 | 0 | 0 | - |\n", "|$s_{1}$| 0 | 2 | 1 | 1 | 0 | 0 | 40 | 40/2=20 |\n", "|$s_{2}$| 0 | 1 | 3 | 0 | 1 | 0 | 45 | 45/1=45 |\n", "|$s_{3}$| 0 | 1 | 0 | 0 | 0 | 1 | 12 | 12/1=12 |\n", "\n", "Now, notice that from the Ratio test, we have easily determined that the variable that leaves the basic solution is $s_{3}$ and using the last equation we can easily determine that $x_1=12$ in the new solution. We will move to another solution (12,0,?,?,0) which corresponds exactly to point D. Now notice that in the first iteration, the problem was expressed in a very convenient way since we had only a non-zero (1) value for each basic variable in every row. To accomplish this, we are going to transform the different rows. Since the equations are linearly independent, we can make linear operations in the different equations and still obtain a linear independent system of equations. We want to obtain a system like this:\n", "\n", "|Basic | z | $x_{1}$ | $x_{2}$ | $s_{1}$ | $s_{2}$ | $s_{3}$ | RHS | Ratio | \n", "|-------|---|---------|---------|---------|---------|---------|--------|----------|\n", "| - | 1 | 0 | ? | 0 | 0 | ? | ? | - |\n", "|$s_{1}$| 0 | 0 | ? | 1 | 0 | ? | ? | ? |\n", "|$s_{2}$| 0 | 0 | ? | 0 | 1 | ? | ? | ? |\n", "|$x_{1}$| 0 | 1 | ? | 0 | 0 | ? | ? | ? |\n", "\n", "Note that when the problem is in this form, we will have each basic variable in a row with coefficient 1 and the rest with coefficient 0 and we will be able to obtain the value for each basic variable rather easily. First we transform the **leaving** equation, by dividing the entire raw by the coefficient of the entering variable in that equation (in this case is 1) and the raw remains unaltered:\n", "\n", "|Basic | z | $x_{1}$ | $x_{2}$ | $s_{1}$ | $s_{2}$ | $s_{3}$ | RHS | Ratio | \n", "|-------|---|---------|---------|---------|---------|---------|--------|----------|\n", "|- | 1 | 0 | ? | 0 | 0 | ? | ? | - |\n", "|$s_{1}$| 0 | 0 | ? | 1 | 0 | ? | ? | ? |\n", "|$s_{2}$| 0 | 0 | ? | 0 | 1 | ? | ? | ? |\n", "|$x_{1}$| 0 | 1/1=1 | 0/1=0 | 0/1=0 | 0/1=0 | 1/1=1 |12/1=12 | ? |\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now, for the rest of the row, we need to make a linear operation that gives a zero in the cell corresponding to the entering variable. To accomplish this, we substract the **entering equation** multiplied by the value of the coefficient that multiplies the entering variable $x_{1}$.\n", "\n", "| Basic | z | $x_{1}$ | $x_{2}$ | $s_{1}$ | $s_{2}$ | $s_{3}$ | RHS | Ratio |\n", "|---------|---|---------|---------|---------|---------|----------|-------------|-------|\n", "| - | 1 | -300-(-300·1)=0 | -250-(-300·0)=0 | 0-(-300·0)=0 | 0-(-300·0)=0 | 0-(-300·1)=300 | 0-(-300·12)=3600 | - |\n", "| $s_{1}$ | 0 | 2-2·1=0 | 1-2·0=1 | 1-2·0=1 | 0-2·0=0 | 0-2·1=-2 | 40-12·2=16 | ? |\n", "| $s_{2}$ | 0 | 1-1·1=0 | 3-1·0=3 | 0-1·0=0 | 1-1·0=1 | 0-1·1=-1 | 45-12·1=33 | ? |\n", "| $x_{1}$ | 0 | 1 | 0 | 0 | 0 | 1 | 12 | ? |\n", "\n", "We end up with the following Tableau:\n", "\n", "| Basic | z | $x_{1}$ | $x_{2}$ | $s_{1}$ | $s_{2}$ | $s_{3}$ | RHS | Ratio |\n", "|---------|---|---------|---------|---------|---------|---------|------|-------|\n", "| - | 1 | 0 | -250 | 0 | 0 | 300 | 3600 | - |\n", "| $s_{1}$ | 0 | 0 | 1 | 1 | 0 | -2 | 16 | ? |\n", "| $s_{2}$ | 0 | 0 | 3 | 0 | 1 | -1 | 33 | ? |\n", "| $x_{1}$ | 0 | 1 | 0 | 0 | 0 | 1 | 12 | ? |\n", "\n", "And the new FSB solution is (12, 0, 16, 32, 0) which as noted corresponds to point D. \n", "\n", "At this point, z has increased from 0 to 3600, but we still have a coefficient in $x_{2}$ that is lower than zero and therefore we could find a higher value if again we move from D to E by increasing $x_{2}$, just as we did with $x_{1}$. We have selected the next entering variable and the pivot column and we can perform the Ratio test again to select the variable leaving the basic solution:\n", "\n", "| Basic | z | $x_{1}$ | $x_{2}$ | $s_{1}$ | $s_{2}$ | $s_{3}$ | RHS | Ratio |\n", "|---------|---|---------|---------|---------|---------|---------|------|-------|\n", "| - | 1 | 0 | -250 | 0 | 0 | 300 | 3600 | - |\n", "| $s_{1}$ | 0 | 0 | 1 | 1 | 0 | -2 | 16 |16 |\n", "| $s_{2}$ | 0 | 0 | 3 | 0 | 1 | -1 | 33 | 11 |\n", "| $x_{1}$ | 0 | 1 | 0 | 0 | 0 | 1 | 12 | 12 |\n", "\n", "The minimum value that makes all variables positive is 11. Therefore, the variable leaving the solution is $s_{2}$. We first transform the new entering row:\n", "\n", "| Basic | z | $x_{1}$ | $x_{2}$ | $s_{1}$ | $s_{2}$ | $s_{3}$ | RHS | Ratio |\n", "|---------|---|---------|---------|---------|---------|---------|-----|-------|\n", "| - | 1 | ? | 0 | 0 | ? | ? | ? | - |\n", "| $s_{1}$ | 0 | 0 | 0 | 1 | ? | ? | ? | ? |\n", "| $x_{2}$ | 0 | 0 | 1 | 0 | 1/3 | -1/3 | 11 | ? |\n", "| $x_{1}$ | 0 | 1 | 0 | 0 | ? | ? | ? | ? |\n", "\n", "And then the rest of the rows using linear transformations as we did before we obtain.\n", "\n", "| Basic | z | $x_{1}$ | $x_{2}$ | $s_{1}$ | $s_{2}$ | $s_{3}$ | RHS | Ratio |\n", "|---------|---|---------|---------|---------|---------|---------|------|-------|\n", "| - | 1 | 0-(-250·0)=0 | -250-(-250·1)=0 | 0-(-250·0)=0 | 0-(-250·1/3)=250/3| 300-(-250·-1/3)=650/3| 3600-(-250·11)=6350 | - |\n", "| $s_{1}$ | 0 | 0 | 1-1=0 | 1-0=0 |0-1/3=-1/3| -2-(-1/3)=-5/3| 16-11=5 | - |\n", "| $x_{2}$ | 0 | 0 | 1 | 0 | 1/3 | -1/3 | 11 | - |\n", "| $x_{1}$ | 0 | 1 | 0 | 0 | 0 | 1 | 12 | - |\n", "\n", "Now we obtain a new solution (12, 11, 5, 0, 0) where z = 6350 and we know for sure that this is a maximum because there are no negative coefficients for any of the non-basic variables that could yield to a higher value of z.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [ { "data": { "text/plain": [ "Text(12, 11, 'E')" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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NTQ0ym311NLSKnj69KlM2bHs7GwJAOjo6LxxkkyqDiWohBBCSDWZO3eu5bp16yyGDBnydMeOHXGlldu0aZNhdHS0HBASI4nk9SEiRkZG+VOnTk1KTEyUbdiwway8a9vY2OTu27cvpvi+y5cvy319fa2XLFnyoFWrVhkly5d1vvJizM3NZWZmZrlHjhyJadKkSXZYWJhW//79G5mZmeVOmjRJaR9VuVzOFy9enLR48eKk9PR0dvDgQb3g4GD9f/75R++ff/7RX7hwIezt7bO6d+/+wsvLK7V///4vZLJX88rMzEy2ePFim65du6ZaWVnlXrt2TQMA4uLiZADw4sUL6bVr1zTMzc3zjI2N8wHA1NQ0986dO1qZmZms5GP+x48fqxsYGOTR431xMc5Vp/4ZY3IA1wA4APiBcz6jxHEXAF8D6ApAHcAlAEs55ycqcv62bdvy8PDwqg26nnh367sAgJBxIaLGQQipeYyxCM5528p+PjIy8p6bm1tyVcZUG8ydO9fS39/fYvDgwU937959r7TH54GBgXojRoxw7t69e4pMJuOHDx9ucOHCheutW7fOUlb+l19+MfDx8bEprwVVmYMHD+r279+/UVBQUEy/fv3SKvq5N42x0IgRI+w0NTULtm7d+sYt5ZGRkRr79+/XP3bsmH54eLhuTk4Oi4qKuubq6vpKF4nk5GSpiYlJy/LO99lnnz3w9fVNBICZM2dafvfddxaHDx+O7t27d3phmYyMDGZkZNSyXbt26adOnbr1pjGTNxMZGWns5uZmr+yYqrWg+gIwUXaAMeYE4CyAPAArAaQCmAzgKGOsD+f8rxqLkhBCCCnDxx9/bOHv728xcODAMpPTEydOaI8ePdqpdevW6fv27bsbGxurfuTIEcP58+db/fXXX3dqOGylKhtjdnY2CwsL0/H29i63T6gybm5u2W5ubklLly5NevHiheTgwYO65ubmeSXL6erqFmzZsiW25P6kpCQ1Hx8f286dO78YP358cps2bf5rMR49evTz77//3sLf39+seILq7+9vkpWVJRkxYsTTkucjNUtlElTGWGsAswHMB7BaSRE/AAYA2nDOryg+sx3AdQA/MMYac1VqDiaEEFIv+fn5maxevdrSwsIip0ePHmk//vjjK3NqWlhY5A0aNOhFRESE5uDBgxva29tnBQcH39bS0uLNmjXLHjZs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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Alias to use numpy library functions\n", "import numpy as np\n", "import matplotlib\n", "# Alias to use matplotlib\n", "import matplotlib.pyplot as plt \n", "# Inline is used to get the output of matplotlib to the output of the cell\n", "%matplotlib inline \n", "\n", "# Construct lines, x represents our decision variable x1 and y represents our decision variable x2\n", "# x > 0\n", "x = np.linspace(0, 100, 2000) #2000 numbers from 0 to 100\n", "# y1 represents the line of constraint 2x1 + x2 <= 40\n", "y1 = -2*x + 40\n", "# y2 represents the line of the constraint x1 + 3x2 <= 45\n", "y2 = (45-x)/3.0\n", "\n", "\n", "matplotlib.rcParams.update({'font.size': 18})\n", "\n", "#1. Make plot\n", "plt.plot(x, y1, label=r'$2x_{1} + x_{2} \\leq 40$') #Plot y1\n", "plt.plot(x, y2, label=r'$x_{1} + 3x_{2} \\leq 45$') #Plot y2\n", "plt.axvline(x=12, label=r'$x_{1} \\leq 12$', c='g') #plot y3\n", "\n", "#2. Adjust axis\n", "plt.xlim((0, 50))\n", "plt.ylim((0, 45))\n", "plt.xlabel(r'$x_{1}$')\n", "plt.ylabel(r'$x_{2}$')\n", "\n", "#3. Fill feasible region\n", "y4=np.minimum(y1, y2) #line representing the maximum between y3 and y2\n", "plt.fill_between(x, y4, 0, where=x<12, color='grey', alpha=0.5) #fill where y5 ys greater than y6\n", "\n", "y5 = (6350-300*x)/250 #line representing the solution\n", "\n", "plt.plot(x, y5, label=r'$300x_{1} + 250x_{2} = 6350$', c='k')\n", "\n", "#4. plot legend\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n", "\n", "#5 Annotate graph\n", "plt.annotate('A', xy=(0, 0))\n", "plt.annotate('B', xy=(0, 15))\n", "plt.annotate('D',xy=(12, 0))\n", "plt.annotate('E', xy=(12,11))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.1" }, "pycharm": { "stem_cell": { "cell_type": "raw", "source": [], "metadata": { "collapsed": false } } } }, "nbformat": 4, "nbformat_minor": 2 }